let result = {};

/**
 * 获取Key在存储中的名称
 * @param key 键
 * @return string 键在存储中的名称
 */
let getKeyName = function (key) {
    return "KANTBOOT-KEY:" + key;
}

/**
 * 根据值获取类型
 * @param value 值
 * @return {string} 值类型
 */
result.getType = function (value) {
    if (value === null) {
        return "null";
    }
    if (value === undefined) {
        return "undefined";
    }
    if (value === "") {
        return "string";
    }
    if (value instanceof Array) {
        return "array";
    }
    if (value instanceof Object) {
        return "object";
    }
    if (value instanceof Function) {
        return "function";
    }
    // 如果是数字
    if (!isNaN(value)) {
        return "number";
    }
    return typeof value;
}

/**
 * 设置存储
 */
result.set = function (key, value,expire) {
    if(expire){
        result.setEx(key, value, expire);
        return;
    }
    let type = result.getType(value);
    let varr = value;
    if (type === "object" || type === "array") {
        varr = JSON.stringify(value);
    }
    let json;
    json = {
        // 存储的值
        value:varr,
        // 存储的类型
        type,
        // 是否有过期时间
        isHasEx: false
    };
    localStorage.setItem(getKeyName(key), JSON.stringify(json));
}

/**
 * 设置存储 且 设置过期时间（单位：毫秒）
 */
result.setEx = function (key, value, expire) {
    let json = {
        // 存储的值
        value: value,
        // 存储的类型
        type: result.getType(value),
        // 是否有过期时间
        isHasEx: true,
        // 过期时间
        expire: new Date().getTime() + expire,
    }
    localStorage.setItem(getKeyName(key), JSON.stringify(json));
}

/**
 * 删除存储
 */
result.remove = function (key) {
    localStorage.removeItem(getKeyName(key));
}

/**
 * 获取存储
 */
result.get = function (key) {
    // 判断是否存在
    if (!localStorage.getItem(getKeyName(key))) {
        return null;
    }
    let json = JSON.parse(localStorage.getItem(getKeyName(key)));
    // 如果没有过期时间
    if (!json.isHasEx) {
        // 如果是存储的类型是object或者array
        if (json.type === "object" || json.type === "array") {
            return JSON.parse(json.value);
        }
        return json.value;
    }
    // 判断是否过期
    if (json.expire < new Date().getTime()) {
        // 删除过期的存储
        result.remove(key);
        return null;
    }
    // if (json.type === "object" || json.type === "array") {
    //     return JSON.parse(json.value);
    // }
    return json.value;

}

/**
 * 清空过期的存储
 */
result.clearByEx = function () {
    // 遍历localStorage
    for (let i = 0; i < localStorage.length; i++) {
        let key = localStorage.key(i);
        // 如果是"KANTBOOT-KEY:"开头的存储
        if (key.startsWith("KANTBOOT-KEY:")) {
            let json = JSON.parse(localStorage.getItem(key));
            if (json.isHasEx) {
                // 判断是否过期，如果过期则删除
                if (json.expire < new Date().getTime()) {
                    localStorage.removeItem(key);
                }
            }
        }
    }
}

/**
 * 加锁
 * @param key 键
 */
result.addLock = function (key) {
    let lockKey = getKeyName(key) + "-LOCK";
    result.setEx(lockKey, true, 1000 * 10);
}

/**
 * 判断是锁住
 * @param key 键
 */
result.isLock = function (key) {
    let lockKey = getKeyName(key) + "-LOCK";
    return !!result.get(lockKey);
}

/**
 * 存储锁
 * @param key 键
 */
result.lock = function (key) {
    if (result.isLock(key)) {
        return true;
    }
    result.addLock(key);
    return false;
}

/**
 * 解锁
 */
result.unlock = function (key) {
    let lockKey = getKeyName(key) + "-LOCK";
    result.remove(lockKey);
}

/**
 * 根据前缀获取所有的存储
 */
result.getKeysByPrefix =  (prefix)=> {
    // 清除过期的存储
    result.clearByEx();
    let res = [];
    for (let i = 0; i < localStorage.length; i++) {
        if (localStorage.key(i).startsWith("KANTBOOT-KEY:" + prefix)) {
            res.push(localStorage.key(i).substring("KANTBOOT-KEY:".length));
        }
    }
    return res;
}


export default result;